package org.huawei260.TiKu.ODsuanfa;

import java.util.Scanner;

/**
 * @Author: qingle
 * @Date: 2024/10/28-16:11
 * @Description: 2528 【模拟】2024E素数之积
 *
 * 题目描述
 * RSA加密算法在网络安全世界中无处不在，它利用了极大些数因数分解的闲难度，数据越大，安全系数越高，给定一个32位整数，请对其进行因数分解，找出是哪两个素数的乘积。
 * 输入格式
 * 1个正整数num
 *
 * 0 < num <= 2147483647
 *
 * 输出格式
 * 如果成功找到，以单个空格分割，从小到大输出两个素数。分解失败，请输出-1 -1
 * 输入样例    复制
 * 15
 * 输出样例    复制
 * 3 5
 * 提示
 * 因数分解后，找到两个素数3和5，使得3*5=15，按从小到大排列后，输出3 5
 *
 * @version: 1.0
 */
//import java.util.Scanner;
public class E_2024E_2528__模拟素数之积2 { // 90% 3 	3 411523 未通过 3*411523=1234569


//	public class Main {
		public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
			System.out.println(getResult(sc.nextInt()));
		}

		// 求解素数之积
		public static String getResult(int n) {
			// 如果n为素数，则必然不可能是两个素数之积
			if (isPrime(n)) {
				return "-1 -1";
			}

			// 假设i为n的因子
			for (int i = 2; i < n; i++) {
				// 若n不能整除i,则i不是n的因子，继续下次循环，找新的i
				// 若n可以整除i,则i就是n的因子
				if (n % i == 0) {
					// j为n的另一因子
					int j = n / i;

					// 只有i,j因子都为素数时，n才是符合题意的素数之积
					if (isPrime(i) && isPrime(j)) {
						// 如果n为两个素数之积，则n只能分解为这两个因子，因为素数无法再次分解出其他因子，也就是说n不再有其他因子了（因子不包含1和自身）
						return i < j ? i + " " + j : j + " " + i;
					} else {
						// 如果i，j有一个不是素数因子，则说明n存在非素数因子，此时n不可能是素数之积
						// 如果i，j为相同的素数因子，则n不是满足题意的素数之积
						// 此时可以判定n不符合要求了，直接退出循环
						break;
					}
				}
			}

			return "-1 -1";
		}

		// 判断n是否为素数
		public static boolean isPrime(int n) {
			if (n <= 3) return n > 1;

			if (n % 6 != 1 && n % 6 != 5) return false;

			for (int i = 5; i <= Math.sqrt(n); i += 6) {
				if (n % i == 0 || n % (i + 2) == 0) {
					return false;
				}
			}

			return true;
		}
	}